Moonbeam与LayerZero之间的跨链互连合约
Moonbeam已将波卡上平行链的内建互操作性扩展至具有互连合约的远程区块链,并通过新协议LayerZero进一步增强互操作性。
互连合约允许智能合约跨链相互通信,提供多链部署dApp的可能性。Moonbeam首个互连合约集成为Axelar,在这篇博客中,您将了解另一个知名跨链协议。
LayerZero旨在成为适用于跨链消息传递的轻量级互操作性协议。LayerZero互连合约设计的优势包含随机排序消息和可进行配置的无需信任。使用LayerZero的互连合约解决方案,开发人员可以构建能够访问波卡、以太坊、Avalanche、Swimmer等公链功能的dApp。
多链dApp目前作为跨多个不同EVM协议的整合接口。协议将能够使用LayerZero的消息传递将其合约进行跨链整合,从而实现多链部署,在原先孤立的生态系统之间实现进阶的互操作性和功能。
为展示互连合约的强大功能,此演示将会把一个字符串自一个EVM测试网发送并存储至另一个EVM测试网。该演示需要一个已添加Moonbase Alpha网络的MetaMask帐户,您可以通过访问Moonbeam文档库页面来完成此操作。
1
LayerZero概览
LayerZero是一种可配置信任的协议,提供安全的跨链通信功能。智能合约形式的超轻节点(ULN)将为区块链提供其他被桥接链的区块头,但仅会以效率为导向提供。LayerZero终端为包含ULN的智能合约,与预言机和中继器进行通信。
预言机组件负责提供和接收区块头。应用可以从包括Chainlink在内的预言机市场中进行选择,并将预言机组件设计成需要多个实体同意。区块头将被发布到目标链,允许对消息进行链上验证。中继器将在接收后提供跨链消息的证明,这些证明可以通过区块头进行验证,其后允许消息在目标链上完成执行。
任何人都可以维护中继器,在实际应用中,LayerZero负责管理当今应用可以使用的中继服务。在接下来的数月中,中继器的开源实现将会创建一个中继器市场,让应用可以从中选择并设计类似于预言机组件,让中继器系统更加去中心化。系统的安全性依赖于预言机和中继器系统之间的分离,因此系统的无需信任功能来自对中继器和预言机执行者的信任程度。
图片来源于LayerZero
这个简易的智能合约范例只包含一个智能合约,NonblockingLzApp。该智能合约将与LayerZero终端交互以接收和发送消息,并通过停止接收未来消息来阻止失败交易的发生。
2
连接SimpleGeneralMessage合约
现在我们可以用最基本的方式实践。要了解您在做什么,请查看您即将部署的合约,该合约已在GitHub gist中提供。
首先,该合约的母合约为NonblockingLzApp,它是从LayerZero GitHub库导入的。该母合约简化了使用LayerZero终端智能合约的技术细节,因此可以非常容易接收跨链消息。
请注意,NonblockingLzApp继承自LzApp。要了解两个合约之间的区别,首先要知道,如果任何连接的合约收到来自LayerZero的消息,并且在收到该消息时,发生未捕获的异常,则将无法收到来自LayerZero的其他消息。
在这种情况下,导致异常的消息通常是正在阻止接收其他消息,并且将持续阻挡消息直到该消息停止造成异常。从LzApp继承时失败的消息会被阻挡,但通过使用NonblockingLzApp,所有导致异常的消息都将会被自动捕获。
简单查看NonblockingLzApp合约是如何接收下面的消息,很明显可以看到,LzApp母合约的_blockingLzReceive函数(由blockingLzReceive调用)被覆盖了。这是当互连合约收到跨链消息时会调用的函数。此外,这个实现还有一行代码调用函数nonblockingLzReceive,以检查是否成功。
接着,您可以查看nonblockingLzReceive函数的实现。它所做的只是确保合约正在调用自身(因此是前一个函数),然后调用开发者可以覆盖的打包函数。这个函数链(blockingLzReceive、_blockingLzReceive、nonblockingLzReceive)所做的唯一一件事就是捕获每个异常并将调用转发给_nonblockingLzReceive,以便开发者可以在收到消息时根据需求编写自定义逻辑。
接着,可以查看SimpleGeneralMessage合约是如何实现_nonblockingLzReceive函数。基本上,它所做的只是获取有效负载并将其写入映射,以便稍后进行读取!
至于发送消息,在讨论如何发送消息前,请再次思考发送消息的流程。用户将向源链上的SimpleGeneralMessage发送一笔交易,然后由LayerZero的预言机和中继器接收,最后,第二笔交易则将由LayerZero的中继器发送到目标链上。
回到代码的部分,实现该操作实际上只需要两行代码。首先,合约将消息编码为字节格式,以便进行跨链发送。第二,消息将会被跨链发送到它所连接的合约。这些参数大多易于理解,而那些不是的参数则与本合约的目的无关。此处重点是目标链ID需被设置为函数输入,负载设置为消息,退款地址设置为消息发送者,目标链的Gas支付(_nativeFee)则设置为消息的值。
此处需要通过_lzSend函数支付Gas费用的原因是有两笔交易:一笔在源链上,另一笔在目标链上。源链上的交易支付方式与您通常使用的交易支付方式相同:通过继承区块链交易的交易费用。第二笔交易是通过LayerZero协议发送额外的原生Token(值)来支付的,用于弥补LayerZero中继器支付的Gas费用。
实践是最好的学习方式,因此请您尝试跟随此演示教程,自己在Moonbase Alpha上部署和执行消息传递。
3
通过Remix在Moonbase Alpha上
进行部署
部署一个Demo合约最简单的方式是通过Remix。您将需要DEV以在Moonbase Alpoha上部署,如果您尚未拥有DEV,您可以从我们提供的Faucet获取。
如需部署脚本,首先请将合约复制并粘贴至Remix,或通过此Remix链接访问。接着在Solidity Compiler标签页面下编译合约,请同时确保您的MetaMask已连接至Moonbase Alpha网络。随后,在Remix的Deploy & Run Transactions标签中将环境设置为Injected Web3,此设置将会把MetaMask作为Web3的提供者。
对于与LayerZero核心功能交互的合约,其需要使用LayerZero终端合约。Moonbase Alpha的终端是0xb23b28012ee92E8dE39DEb57Af31722223034747,您可以在LayerZero的文档页面上找到其他网络的终端。在您将合约部署到Moonbase Alpha时,可以在构造函数中使用此合约地址。
当您在Moonbase Alpha上成功部署合约后,请确保复制其地址并使用连接到LayerZero的任何EVM测试网重复该流程,以确保它可以跨链发送消息。
4
添加可信任源
由于手上的智能合约继承自LzApp母智能合约,因此其自带可信任的合约安全系统。为了让智能合约在收到消息时调用_nonblockingReceive,消息必须来自可信任源。
要将合约添加为可信任远程合约,您必须调用setTrustedRemote函数。只有合约拥有者(一般情况下默认为部署者)才能设置信任的远程地址。_srcChainId是源链的LayerZero链ID,您可以在他们的文档页面和以上表格中找到。_path是字节串格式的信任地址。
LzApp在trustedRemoteLookup映射中储存来自每个链的单个可信源。然而,它的存储方式相较于简单的地址更为复杂。该格式需要将两个地址打包成字节串格式:第一个是消息源,最后一个是消息目的地。虽然这种方式看上去比较奇怪,但在遭遇检查未经授权消息的情况时,它使LzApp更容易被实现。
举例来说,如果你想从lzID为100的链上合约0xAAAAAAAAAAAAAAAAAAAA向lzID为101的链上合约0xBBBBBBBBBBBBBBBBBBBB发送消息,您会将格式化后一条链上的可信任远程调用:
setTrustedRemote(101, 0xBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAA)
但是,还有一种更简单的方法可以做到这一点。LayerZero在其实现中提供了一个setTrustedRemoteAddress函数来帮助格式化消息。您仅需要输入LayerZero的链ID(_remoteChainId)和您希望合约在目标/远程链上信任的地址(_remoteAddress)。
现在您可以使用Remix来确保你的两个合约相互信任,您必须对已部署的两个合约执行此操作。要在不同链上的合约之间切换,请通过MetaMask连接到您想要的网络。同时,确保您处于Injected Provider环境中并且合约保持为“SimpleGeneralMessage”。接着,获取目标合约的地址,并将其贴至At Address输入栏中。
要添加受信任的远程地址,请在SimpleGeneralMessage合约中找到setTrustedRemoteAddress函数并将其打开。
当您在Moonbase Alpha上时,将_remoteChainId设置为您选择的另一个EVM测试网的LayerZero链ID(LayerZero链ID可以在他们的文档页面或上方表格中找到)。其后,将_remoteAddress设置为您在另一个EVM测试网上部署的合约的地址。最后,在MetaMask中进行交易和确认。
当您在备用EVM测试网上时,将_remoteChainId设置为Moonbase Alpha的LayerZero链ID(10126)。并将_remoteAddress设置为您在Moonbase Alpha上部署的合约的地址。最后,在MetaMask中进行交易和确认。
在本部分教程中,您应该已经在两条链上发送了两笔交易,以在两个合约中设置可信任的远程地址。未来,您应当可以在关联合约之间发送交易。
5
通过LayerZero从Moonbase
传送跨链消息
要发送带有自动目标链交易的跨链消息,您必须使用LayerZero终端消息支付额外的Gas以抵消目标链的Gas成本。这种额外的Gas支付以您包含在交易中的原生Token(GLMR、ETH等)形式出现,并被设置为消息的值。
在此教程中,估算跨链交易Gas费用的方法超出了主题范围。为了简单起见,在测试网上,最好使用跨链消息发送一笔大数额的原生Token,例如500000000 Gwei。如果有剩余金额,若花费不大则可以进行退还。
现在您可以使用Remix接口操作。此范例将向Fantom测试网发送跨链消息,但您可以用Gas数值和链名称替换您想要的任何EVM网络。
接着,检查以下事项:
环境为Injected Provider – Web3 on network 1287(Moonbase Alpha)同时,您的钱包里有来自faucet的大量资金,以支付交易成本和目标链Gas 包含的DEV
您在上一步中将Gas费用设置为500000000 Gwei后输入
在sendMessage调用的消息输入中输入您选择的短消息(在本例中为“gm”)
将目标链的LayerZero ID放入sendMessage调用的destChainId输入栏中。由于您是在测试网上发送交易,因此ID应该在10000以上
当您完成上述步骤,请执行交易并在MetaMask中确认。
6
追踪跨链消息
在您发送交易后,您应该能够进入Moonbase Alpha区块浏览器使用其交易哈希查看交易。如果一切顺利,交易应当能够被成功确认,而当您以UTF-8格式查看时,您将能够在最底部看到交易输入的痕迹。
在一般的交易中,交易的状态和数据将可在一个浏览器的页面上看到。但是,由于这是跨链消息传递,因此实际上在两条链上发生了两笔EVM交易。
如果一切顺利,交易将被批准,您将能够看到跨链交易成功后在源链中更新的lastMessage!如果它没有自动更新,请不要担心。一般来说,交易完成大约需要30秒到一分钟的时间。
如果您想查看储存在合约中的消息,您可以通过Remix操作。首先,通过MetaMask连接到目标网络。接着,确保您处于Injected Provider环境中,并且选择的合约仍然是“SimpleGeneralMessage”。然后,获取目标合约的地址,并将其粘贴到At Address输入栏中。点击后,您应该可以使用获得的合约结果查看最后一条消息。
如果您没有看到消息的结果,LayerZero有一个浏览器来追踪交易,您可以使用第一个源链消息的交易哈希来追踪跨链消息的状态。
7
深入了解跨链互连合约
Moonbeam的网络的互操作性中心的愿景不止于此。了解LayerZero的更多信息,请访问LayerZero网站:https://layerzero.network/
关于如何发送跨链消息,请访问:https://layerzero.gitbook.io/docs/
阅读关于Moonbeam如何成为区块链互操作性的领导者,请访问Moonbeam的Connected Contracts页面:https://moonbeam.network/builders/connected-contracts/
Moonbeam是一个智能合约平台,用于构建跨链互连应用程序,能够访问任何链上的用户、服务。通过将来自以太坊、Cosmos、波卡等功能整合到一个平台中,Moonbeam解决了当今用户体验碎片化的问题,解锁了真正的互操作性,并为下一代应用程序奠定基础。
Moonbeam平台使用集成的跨链信息传递,允许开发者创建访问多个远程区块链服务的智能合约。通过此方式结合Moonbeam的开发者友好型EVM平台、各类工具支持和Substrate架构,为构建互连应用程序提供理想化的开发环境。
如需了解更多信息,请访问:
https://moonbeam.network/
Moonbeam
欢迎加入Moonbeam社区
期待与您携手打造去中心化跨链世界 ~
△ 获取Moonbeam官方最新资讯
更多Moonbeam信息
官网: https://moonbeam.network
Twitter: https://twitter.com/MoonbeamCN
Telegram: https://t.me/moonbeam_CN
Discord: https://discord.gg/skPfXvJWG7
中文电报群助手:@MoonbeamSister